package com.wxzhou.wangzhuan.dto;

import org.eclipse.microprofile.openapi.annotations.media.Schema;

import java.io.Serializable;
import java.util.List;

/**
 * 通用分页响应对象
 * @param <T> 业务数据类型
 */
@Schema(description = "通用分页响应对象", example = "{\"page\":1,\"limit\":20,\"count\":100,\"list\":[]}")
public class PageResponseDto<T> implements Serializable {
    /** 当前页码 */
    @Schema(description = "当前页码", example = "1")
    private Integer page;
    /** 每页条数 */
    @Schema(description = "每页条数", example = "20")
    private Integer limit;
    /** 总条数 */
    @Schema(description = "总条数", example = "100")
    private Integer count;
    /** 数据列表 */
    @Schema(description = "数据列表", example = "[]")
    private List<T> list;

    // 构造函数
    public PageResponseDto() {}
    
    public PageResponseDto(Integer page, Integer limit, Integer count, List<T> list) {
        this.page = page;
        this.limit = limit;
        this.count = count;
        this.list = list;
    }

    // 静态工厂方法
    /**
     * 从原始分页响应和转换后的数据列表创建新的分页响应
     * @param sourcePageResponse 原始分页响应
     * @param convertedList 转换后的数据列表
     * @param <T> 数据类型
     * @return 新的分页响应对象
     */
    public static <T> PageResponseDto<T> of(PageResponseDto<?> sourcePageResponse, List<T> convertedList) {
        return new PageResponseDto<>(
            sourcePageResponse.getPage(),
            sourcePageResponse.getLimit(),
            sourcePageResponse.getCount(),
            convertedList
        );
    }
    
    /**
     * 从分页参数和数据列表创建分页响应
     * @param page 当前页码
     * @param limit 每页条数
     * @param count 总条数
     * @param list 数据列表
     * @param <T> 数据类型
     * @return 分页响应对象
     */
    public static <T> PageResponseDto<T> of(Integer page, Integer limit, Integer count, List<T> list) {
        return new PageResponseDto<>(page, limit, count, list);
    }
    
    /**
     * 创建空的分页响应
     * @param page 当前页码
     * @param limit 每页条数
     * @param <T> 数据类型
     * @return 空的分页响应对象
     */
    public static <T> PageResponseDto<T> empty(Integer page, Integer limit) {
        return new PageResponseDto<>(page, limit, 0, List.of());
    }

    // getter和setter
    public Integer getPage() { return page; }
    public void setPage(Integer page) { this.page = page; }
    public Integer getLimit() { return limit; }
    public void setLimit(Integer limit) { this.limit = limit; }
    public Integer getCount() { return count; }
    public void setCount(Integer count) { this.count = count; }
    public List<T> getList() { return list; }
    public void setList(List<T> list) { this.list = list; }
} 